﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Net.Mail;
using System.Text;
using System.Data.Linq;
using System.Web.Mvc;
using EGym.BL.Exceptions;
using EGym.BL.Forms;
using EGym.Data;

namespace EGym.BL.DataGestor
{
    public class UsuarioGestor : BaseGestor
    {
        #region Constantes
        private const int AFILIADO_CODIGO_CADASTRO_PAI = 1;
        #endregion

        #region Construtores

        public UsuarioGestor(DBDataContext db)
        {
            BussinessLayerEntryExceptions = new List<BussinessLayerEntryException>();
            DB = db;
        }
        #endregion

        #region Propriedades
        public IEnumerable<BussinessLayerEntryException> BussinessLayerEntryExceptions { get; private set; }
        #endregion

        #region Metodos

        #region Publicos

        #region Métodos para retorno de Formulários

        #endregion

        public bool UserNameDisponivel(int afiliadoId, string userName)
        {
            var usuario = (from reg in DB.Usuarios
                           where reg.UserName.ToLower().Equals(userName.ToLower()) &&
                                 reg.AfiliadoId.Equals(afiliadoId)
                           select reg
                          ).FirstOrDefault();
            return usuario == null;
        }

        public bool EmailJaCadastrado(int afiliadoId, string email)
        {
            var usuario = (from reg in DB.Usuarios
                           where reg.EMail.ToLower().Equals(email.ToLower()) &&
                                 reg.AfiliadoId.Equals(afiliadoId)
                           select reg
                          ).FirstOrDefault();
            return usuario != null;
        }

        public void EfeutaInscricaoUsuarioAdministradorAfiliacao(AfiliadoForm form)
        {
            form.BussinessLayerEntryExceptions= ValidaInscricao(form);

            if (!form.DadosSaoValidos())
                throw new Exception("Ocorreram erros na validação do formulário");
            //Aplica campos Automáticos
            AplicaValoresAutomaticosParaInsercao(form);

            DB.Usuarios.InsertOnSubmit(form.UsuarioAdministradorAfiliacao);
            if (!form.UsuarioAdministradorAfiliacao.AfiliadoId.Equals(AFILIADO_CODIGO_CADASTRO_PAI))
                DB.Usuarios.InsertOnSubmit(CriaCopia(form.UsuarioAdministradorAfiliacao));

            ;
        }
        public void EnviaEmailAoUsuarioSobreInscricao(AfiliadoForm form)
        {
            MailMessage message = new MailMessage();
            message.From = new MailAddress("sender@lemestobias.com.br", "eGym - Rede Online de Academias");

            message.To.Add(new MailAddress(form.UsuarioAdministradorAfiliacao.EMail));
            message.Bcc.Add(new MailAddress("danielcbueno@msn.com"));
            
            message.Subject = "eGym - Inscrição na rede online de academias";
            message.Body = string.Format(@"
Olá {0},

Seja bem vindo ao eGym.

Nesse e-mail contém os dados pertinentes a sua inscrição na nossa rede online de academias.
----------------------------------------------------------------------------------------
Nome................: {0}
Data da Inscrição...: {1:dd/MM/yyyy}
Nome do seu Usuário.: {2}
Senha...............: {3}
----------------------------------------------------------------------------------------

Em caso de dúvida, entre em contato através do contato@egym.com.br

Att,

Equipe de Administração eGym - Rede Online de Academias.
", form.Afiliado.Nome, form.Afiliado.DataCadastro, form.UsuarioAdministradorAfiliacao.UserName, form.UsuarioAdministradorAfiliacao.Password);

            SmtpClient client = new SmtpClient("smtp.lemestobias.com.br");
            
            client.UseDefaultCredentials = false;
            client.Credentials = new System.Net.NetworkCredential("sender@lemestobias.com.br", "!123asw");

            client.Send(message);
        }

        #endregion

        #region Privados

        
        private Usuario CriaCopia(Usuario usuario)
        {
            Usuario usuarioCopia = new Usuario();
            usuarioCopia.UserName = usuario.UserName;
            usuarioCopia.EMail = usuario.EMail;
            usuarioCopia.TwitterAccount = usuario.TwitterAccount;
            usuarioCopia.Password = usuario.Password;
            usuarioCopia.DataCadastro = usuario.DataCadastro;
            usuarioCopia.AfiliadoId = AFILIADO_CODIGO_CADASTRO_PAI;

            return usuarioCopia;
        }

        private string GeraSenhaAletoria()
        {
            Guid guid = Guid.NewGuid();
            return guid.ToString("n").Substring(0, 6);
        }

        private void AplicaValoresAutomaticosParaInsercao(AfiliadoForm form)
        {
            form.UsuarioAdministradorAfiliacao.DataCadastro = DateTime.Now;
            form.UsuarioAdministradorAfiliacao.Password = GeraSenhaAletoria();
            form.UsuarioAdministradorAfiliacao.Afiliado = form.Afiliado;
            if (string.IsNullOrEmpty(form.UsuarioAdministradorAfiliacao.TwitterAccount))
                form.UsuarioAdministradorAfiliacao.TwitterAccount = string.Empty;
        }


        private IEnumerable<BussinessLayerEntryException>  ValidaInscricao(AfiliadoForm form)
        {
            var bussinessLayerEntryExceptions = new List<BussinessLayerEntryException>();

            bussinessLayerEntryExceptions.AddRange(ValidaExistencia(form));

            bussinessLayerEntryExceptions.AddRange(ValidaExistencia(form));

            return bussinessLayerEntryExceptions;
        }

        private IEnumerable<BussinessLayerEntryException>  ValidaExistencia(AfiliadoForm form)
        {
            var bussinessLayerEntryExceptions = new List<BussinessLayerEntryException>();

            return bussinessLayerEntryExceptions;
        }

        #endregion
        #endregion
    }
}